home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Express Pd: GALORE
/
Express Pd Galore - The Amiga PD & Shareware CD (1994)(Express Pd)[!][Amiga-CD32-CDTV].iso
/
productivity
/
term
/
termlocale.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-07-16
|
6KB
|
363 lines
/*
** termLocale.c
**
** Localization support routines
**
** Copyright © 1990-1993 by Olaf `Olsen' Barthel & MXM
** All Rights Reserved
*/
#include "termGlobal.h"
extern struct
{
LONG as_ID;
STRPTR as_Str;
} AppStrings[];
extern LONG NumAppStrings;
/* LocaleOpen(STRPTR CatalogName,STRPTR BuiltIn):
*
* Open string translation tables.
*/
VOID __regargs
LocaleOpen(STRPTR CatalogName,STRPTR BuiltIn,LONG Version)
{
if(LocaleBase = (struct LocaleBase *)OpenLibrary("locale.library",38))
{
if(LocaleBase -> lb_SysPatches)
{
strcpy(ConvNumber,"%lD");
strcpy(ConvNumber10,"%10lD");
Catalog = OpenCatalog(NULL,CatalogName,
OC_BuiltInLanguage, BuiltIn,
OC_BuiltInCodeSet, 0,
OC_Version, Version,
TAG_DONE);
Locale = OpenLocale(NULL);
}
else
{
strcpy(ConvNumber,"%ld");
strcpy(ConvNumber10,"%10ld");
CloseLibrary(LocaleBase);
LocaleBase = NULL;
}
}
else
{
strcpy(ConvNumber,"%ld");
strcpy(ConvNumber10,"%10ld");
}
}
/* LocaleClose():
*
* Close the translation tables.
*/
VOID
LocaleClose()
{
if(Locale)
{
CloseLocale(Locale);
Locale = NULL;
}
if(Catalog)
{
CloseCatalog(Catalog);
Catalog = NULL;
}
if(LocaleBase)
{
CloseLibrary(LocaleBase);
LocaleBase = NULL;
}
}
/* LanguageCheck():
*
* Checks to see if the currently selected language
* is english.
*/
VOID
LanguageCheck()
{
if(Locale && Catalog)
{
if(Locale -> loc_LanguageName)
{
if(!Stricmp(Locale -> loc_LanguageName,"english.language"))
English = TRUE;
else
English = FALSE;
}
else
English = FALSE;
}
else
English = TRUE;
}
/* GadToolsStrlen(STRPTR *String):
*
* Custom version of strlen, useful for gadtools object titles
* with embedded underscore characters.
*/
WORD __regargs
GadToolsStrlen(STRPTR String)
{
WORD Len = 0;
while(*String)
{
if(*String++ != '_')
Len++;
}
return(Len);
}
/* GadToolsLongestString(WORD From,WORD To):
*
* Determines the longest string used by a gadtools
* control panel.
*/
WORD __regargs
GadToolsLongestString(WORD From,WORD To)
{
STRPTR Text;
WORD MaxLen = 0,
Len,i;
for(i = From ; i <= To ; i++)
{
if(Text = LocaleString(i))
{
if((Len = GadToolsStrlen(Text)) > MaxLen)
MaxLen = Len;
}
}
return(MaxLen);
}
/* LocaleSeconds(WORD Seconds):
*
* Return seconds in proper format.
*/
STRPTR __regargs
LocaleSeconds(WORD Seconds)
{
STATIC UBYTE Time[10];
if(Locale)
SPrintf(Time,"%2lD%s%02lD",Seconds / 100,Locale -> loc_DecimalPoint,Seconds % 100);
else
SPrintf(Time,"%2ld.%02ld",Seconds / 100,Seconds % 100);
return(Time);
}
/* SmallCurrency():
*
* Support function for the rates control panel, returns a formatted
* string to contain a string like "cents/unit".
*/
STRPTR __regargs
SmallCurrency()
{
STATIC UBYTE Buffer[30];
if(Locale)
SPrintf(Buffer,LocaleString(MSG_RATEPANEL_PAY_PER_UNIT_GAD),Locale -> loc_MonSmallCS);
else
SPrintf(Buffer,LocaleString(MSG_RATEPANEL_PAY_PER_UNIT_GAD),"Pay");
return(Buffer);
}
/* CreateSum(LONG Quantity):
*
* Create a string containing a monetary quantity formatted
* according to the current locale rules.
*/
STRPTR __regargs
CreateSum(LONG Quantity,BYTE UseCurrency)
{
STATIC UBYTE Buffer[30],Buffer1[30],Buffer2[30];
if(Locale)
{
if(Locale -> loc_MonFracDigits < 6)
{
STATIC LONG Power[] = { 1, 10, 100, 1000, 10000, 100000 };
LONG Int,
Frac;
if(UseCurrency)
{
strcpy(Buffer2,"%s %lD%s%");
SPrintf(&Buffer2[9],"%02ld",Locale -> loc_MonFracDigits);
strcat(Buffer2,"lD");
Int = Quantity / Power[Locale -> loc_MonFracDigits];
Frac = Quantity % Power[Locale -> loc_MonFracDigits];
SPrintf(Buffer,Buffer2,Locale -> loc_MonCS,Int,Locale -> loc_MonDecimalPoint,Frac);
}
else
{
strcpy(Buffer2,"%lD%s%");
SPrintf(&Buffer2[6],"%02ld",Locale -> loc_MonFracDigits);
strcat(Buffer2,"lD");
Int = Quantity / Power[Locale -> loc_MonFracDigits];
Frac = Quantity % Power[Locale -> loc_MonFracDigits];
SPrintf(Buffer1,Buffer2,Int,Locale -> loc_MonDecimalPoint,Frac);
return(Buffer1);
}
}
else
SPrintf(Buffer,"%lD.%02ld",Quantity / 100,Quantity % 100);
}
else
SPrintf(Buffer,"%ld.%02ld",Quantity / 100,Quantity % 100);
return(Buffer);
}
/* LocalizeString(STRPTR *Strings,WORD From,WORD To):
*
* Localize an array of strings.
*/
VOID __regargs
LocalizeString(STRPTR *Strings,WORD From,WORD To)
{
WORD i,j;
for(i = From, j = 0 ; i <= To ; i++)
{
if(!Strings[j])
Strings[j++] = LocaleString(i);
}
}
/* LocalizeMenu(struct NewMenu *Menu,WORD From):
*
* Localize a NewMenu definition.
*/
VOID __regargs
LocalizeMenu(struct NewMenu *Menu,WORD From)
{
STRPTR Label,Shortcut;
while(Menu -> nm_Type != NM_END)
{
Shortcut = LocaleString(From);
if(Shortcut[0] && !Shortcut[1])
Label = Shortcut + 2;
else
{
Label = Shortcut;
Shortcut = NULL;
}
switch(Menu -> nm_Type)
{
case NM_TITLE:
Menu -> nm_Label = Label;
From++;
break;
case NM_ITEM:
case NM_SUB:
if(Menu -> nm_Label != NM_BARLABEL)
{
Menu -> nm_Label = Label;
Menu -> nm_CommKey = Shortcut;
From++;
}
break;
}
Menu++;
}
}
/* LocaleString(LONG ID):
*
* Obtain a string from the translation pool.
*/
STRPTR __regargs
LocaleString(LONG ID)
{
STRPTR Builtin;
if(ID < NumAppStrings && AppStrings[ID] . as_ID == ID)
Builtin = AppStrings[ID] . as_Str;
else
{
LONG i;
Builtin = "";
for(i = 0 ; i < NumAppStrings ; i++)
{
if(AppStrings[i] . as_ID == ID)
{
Builtin = AppStrings[i] . as_Str;
break;
}
}
}
if(Catalog)
{
STRPTR String = GetCatalogStr(Catalog,ID,Builtin);
if(String[0])
return(String);
else
return(Builtin);
}
else
return(Builtin);
}